/**
 * 
 */
package org.hotpotmaterial.codegenn2.utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

/**
 * @author cakydeveloper
 *
 */
public class RandomUtil {
	
	/**
	   * 隐藏工具类的构造方法
	   */
	  private RandomUtil() {}

	  /**
	   * 字符串类型枚举
	   * 
	   * @author ASUS
	   */
	  public enum TYPE {
	    /**
	     * 字符型
	     */
	    LETTER,
	    /**
	     * 大写字符型
	     */
	    CAPITAL,
	    /**
	     * 数字型
	     */
	    NUMBER,
	    /**
	     * 符号型
	     */
	    SIGN,
	    /**
	     * 大+小字符 型
	     */
	    LETTER_CAPITAL,
	    /**
	     * 小字符+数字 型
	     */
	    LETTER_NUMBER,
	    /**
	     * 大+小字符+数字 型
	     */
	    LETTER_CAPITAL_NUMBER,
	    /**
	     * 大+小字符+数字+符号 型
	     */
	    LETTER_CAPITAL_NUMBER_SIGN
	  }

	  // 小写字母数组
	  private static String[] lowercase = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",
	      "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
	  // 大写字母数组
	  private static String[] capital = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L",
	      "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
	  // 数值数组
	  private static String[] number = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
	  // 符号数组
	  private static String[] sign =
	      {"~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", "`", "-", "=", "{", "}",
	          "|", ":", "\"", "<", ">", "?", "[", "]", "\\", ";", "'", ",", ".", "/"};

	  /**
	   * 静态随机数
	   */
	  private static Random random = new Random();

	  /**
	   * 获取随机组合码
	   * 
	   * @param num 位数
	   * @param type 类型
	   * @type <br>
	   *       字符型 LETTER, <br>
	   *       大写字符型 CAPITAL, <br>
	   *       数字型 NUMBER, <br>
	   *       符号型 SIGN, <br>
	   *       大+小字符型 LETTER_CAPITAL, <br>
	   *       小字符+数字 型 LETTER_NUMBER, <br>
	   *       大+小字符+数字 型 LETTER_CAPITAL_NUMBER, <br>
	   *       大+小字符+数字+符号 型 LETTER_CAPITAL_NUMBER_SIGN
	   */
	  public static String getRandom(int num, TYPE type) {
	    // 定义字符待选列表
	    ArrayList<String> temp = new ArrayList<>();
	    // 生成串存储变量
	    StringBuilder code = new StringBuilder();
	    // 类型选择
	    if (type == TYPE.LETTER) {
	      // 字符待选列表增加小写字母
	      temp.addAll(Arrays.asList(lowercase));
	    } else if (type == TYPE.CAPITAL) {
	      // 字符待选列表增加大写字母
	      temp.addAll(Arrays.asList(capital));
	    } else if (type == TYPE.NUMBER) {
	      // 字符待选列表增加数字
	      temp.addAll(Arrays.asList(number));
	    } else if (type == TYPE.SIGN) {
	      // 字符待选列表增加符号
	      temp.addAll(Arrays.asList(sign));
	    } else if (type == TYPE.LETTER_CAPITAL) {
	      // 字符待选列表增加小写字母
	      temp.addAll(Arrays.asList(lowercase));
	      // //字符待选列表增加大写字母
	      temp.addAll(Arrays.asList(capital));
	    } else if (type == TYPE.LETTER_NUMBER) {
	      // 字符待选列表增加小写字母
	      temp.addAll(Arrays.asList(lowercase));
	      // 字符待选列表增加数字
	      temp.addAll(Arrays.asList(number));
	    } else if (type == TYPE.LETTER_CAPITAL_NUMBER) {
	      // 字符待选列表增加小写字母
	      temp.addAll(Arrays.asList(lowercase));
	      // 字符待选列表增加大写字母
	      temp.addAll(Arrays.asList(capital));
	      // 字符待选列表增加数字
	      temp.addAll(Arrays.asList(number));
	    } else if (type == TYPE.LETTER_CAPITAL_NUMBER_SIGN) {
	      // 字符待选列表增加小写字母
	      temp.addAll(Arrays.asList(lowercase));
	      // 字符待选列表增加大写字母
	      temp.addAll(Arrays.asList(capital));
	      // 字符待选列表增加数字
	      temp.addAll(Arrays.asList(number));
	      // 字符待选列表增加符号
	      temp.addAll(Arrays.asList(sign));
	    }
	    for (int i = 0; i < num; i++) {
	      // 得到随机字符
	      code.append(temp.get(random.nextInt(temp.size())));
	    }
	    // 返回生成字符串
	    return code.toString();
	  }

}
